#include "Cache.h"
#include <stdio.h>
#include "Functions.h"
#include "../utils/Constantes.h"

using std::cout;
using std::endl;
using namespace convertTypes;

Cache::Cache() {
	buscados = new List();
}

Cache::~Cache() {
	buscados->~List();
	if (buscados != NULL)
		delete buscados;
}

void Cache::insert(QueryToken newToken) {

	TermYFrecQuery* term = new TermYFrecQuery();
	term->vecesFueConsultado = 1;
	term->termino = newToken.word;
	term->datosTermino = new vector<Data>(*(newToken.v_data));
	buscados->insertar(term);
}

//inserta donde corresponde
void Cache::insert(TermYFrecQuery* dato){
	this->buscados->insertar(dato);
}

TermYFrecQuery* Cache::search(string token) {

	TermYFrecQuery* datosTemp = this->buscados->buscar(token);
	if( datosTemp == NULL){ //No encontro
//		if(DEBUG > 0)
//			cout<<"[CACHE_TERMINO_NO ENCONTRADO]: Termino: \""<< token << "\"." << endl;
	} else {
		datosTemp->vecesFueConsultado++;
//		if(DEBUG > 0)
//			cout<<"[CACHE_TERMINO_ENCONTRADO]: Termino: \""<< token << "\". "<<std::endl;
	}
	return datosTemp;
}

void Cache::printCache() {

	TermYFrecQuery* temp;
	bool eol = false;

	//Me paro en el 1ro
	this->buscados->moveRoot();
	eol = this->buscados->isEmpty();
	while(!eol) {
		temp = this->buscados->getElement();
		cout << "\tClave:" << temp->termino << " " << temp->vecesFueConsultado << endl;
		if(temp->datosTermino != NULL) {
			for(vector<Data>::iterator iter = temp->datosTermino->begin(); iter != temp->datosTermino->end(); iter++) {
				cout << "\t\t\tDoc: " << (*iter).document << " Frec: " << (*iter).frecuency << "\tPos:";
				if((*iter).frecuency > 0)
					for(unsigned int i = 0; i < (*iter).frecuency; i++)
						cout << ((*iter).pos->at(i)) << " ";
				cout << endl;
			}
		}
		eol = !(this->buscados->moveNext());
	}
}

void Cache::eliminateLeastFrequent() {
	if(!(this->buscados->isEmpty())) {
		unsigned int i = 0;
		unsigned int nroNodeToEliminate = 0;
		this->buscados->moveRoot();
		unsigned int minFreq = buscados->getElement()->vecesFueConsultado;

		while(buscados->moveNext()) {
			i++;
			if ( buscados->getElement()->vecesFueConsultado < minFreq)
				nroNodeToEliminate = i;
		}
		buscados->dispose(nroNodeToEliminate);
	}
}
